<?
  set_time_limit(4500);
  /* Se asegura que el archivo es incluido por el index */
	defined( 'LOAD_MODULE_ACTION' ) or die( 'No esta permitido el acceso directo a ' . __FILE__ );
	/* Cuando se hace el include del archivo automaticamente crea un objeto y lo guarda en una variable temporal */
		$this->oTmpObject = new Clase_exe( $this );

	class Clase_exe extends Exe
	{
	function Clase_exe( &$oModule )
		{
			$this->oModule = &$oModule;
		  // Valida que el Entorno sea el Parametrico
			if ( ES_PARAMETRICO == false )
			{
			  addMessage('Esta accion solo puede hacerse en el entorno parametrico');
			  $this->oModule->back();
			}
			$this->oDatabase = openMetadataDB ( getParam('cPathModule') );
		}
	function import()
		{
		}
  // MODIFICAR_CLASE
  function update()
	{
	  // Convierte a variables los datos del Formulario asociado a la accion
	  $oForm = $this->oModule->loadClass( 'Clase_frm' );
	  extract( $oForm->getFieldArray() );
	  // Si cambio el nombre del Archivo lo hace Fisicamente
	  list ( $cDirectorioAnterior, $cArchivoAnterior ) = $this->oDatabase->getArray("SELECT cDirectorio, cArchivo FROM stClase WHERE ncClase =$ncClase");
	  if ( $cDirectorio == $cDirectorioAnterior && $cArchivo != $cArchivoAnterior )
	  {
		rename(  "$cDirectorioAnterior/$cArchivoAnterior" ,  "$cDirectorio/$cArchivo" );
	  }
	  // Modifica el Registro
	  $this->oDatabase->update("stClase",
				"ncSubModulo", $ncSubModulo,
				"cArchivo", $cArchivo,
				"cDirectorio", $cDirectorio,
				"ncTipoClase", $ncTipoClase,
				"cFisico", $cFisico,
				"cdClase", $cdClase,
				"WHERE", "ncClase", $ncClase );
		$this->setInputData(  $ncClase , $cFisico );
		$oForm->reset();
	}
  // AGREGAR_CLASE
  function insert()
	{
		// Convierte a variables los datos del Formulario asociado a la accion
		$oForm = $this->oModule->loadClass( 'Clase_frm' );
		extract( $oForm->getFieldArray() );
		// Si no viene el Directorio lo Obtiene del Modulo
		if ( $cDirectorio == '' )
		{
			// Si es Tabla => pone los default
			if ( $ncTipoClase == TIPO_CLASE_PARAMETRICAS || $ncTipoClase == TIPO_CLASE_MOVIMIENTOS )
			{
				$cArchivo = $cFisico . "_cre.sql";
				$cDirectorio .= "db";
			} elseif ( $cArchivo == '' )
			{
			  $cArchivo = $cFisico ;
			}
		}
	  $cFiltro = "";
	  // Busca los Rangos de asignacion de clases
	  if ( $ncSubModulo )
	  {
		list ( $nDesde, $nHasta )= $this->oDatabase->getArray("select nDesde, nHasta FROM stSubModulo Where ncSubModulo = $ncSubModulo" );
		if ( $ncTipoClase != TIPO_CLASE_PARAMETRICAS && $ncTipoClase != TIPO_CLASE_MOVIMIENTOS )
		{
		  $nDesde += 1000;
		  $nHasta += 1000;
		}
		$cFiltro = " ncClase between $nDesde and $nHasta " ;
	  }
	  // Busca la proxima clave
	  $ncClase = $this->oDatabase->nextKey("stClase", "ncClase", $cFiltro );
	  if ( $ncClase < $nDesde ) $ncClase  = $nDesde;
	  // Agrega el registro
	  $this->oDatabase->insert("stClase", "ncSubModulo", $ncSubModulo, "cArchivo", $cArchivo, "cDirectorio", $cDirectorio, "ncEstadoClase", 1, "ncTipoClase", $ncTipoClase, "cFisico", $cFisico, "cdClase", $cdClase, "ncClase", $ncClase );
		// Redirecciona la siguiente accion
		$this->setInputData(  $ncClase , $cFisico );
	  $oForm->reset();
	  $this->oModule->setRedirect( MODIFICAR_CLASE, "ncClase=$ncClase" );
	}

  // ELIMINAR_UNA_CLASE
  function delete() 
	{
	  $oncClase	  = new InputNumber('', "ncClase" );
	  $aClases     = $oncClase->getValueAsArray();
	  foreach( $aClases  as $ncClase )
	  {
		if ( $ncClase )
		{
		  // Relaciones
		  // Elimina los metodos
		  $this->oDatabase->delete("stClaseMetodo", "ncClase", $ncClase );
		  // Elimina los Atributos
		  $this->oDatabase->delete("stClaseAtributo", "ncClase", $ncClase );
		  // Elimina la Clase
		  $this->oDatabase->delete("stClase", "ncClase", $ncClase );
		}
	  }
	}
  // AGREGAR_CLASE_PARAMETRICA:
  function insertParametrica()
	{
	  // Convierte a variables los datos del Formulario asociado a la accion
	  $oForm = $this->oModule->loadClass( 'Parametrica_frm' );
	  extract( $oForm->getFieldArray() );
	  // Busca la proxima clave
	  $ncClase = $this->oDatabase->nextKey("stClase", "ncClase");
	  // Agrega la Clase
	  $this->oDatabase->insert("stClase", "ncSubModulo", $ncSubModulo, "ncTipoClase", $ncTipoClase, "cFisico", $cFisico, "cdClase", $cdClase, "ncClase", $ncClase );
	  // Quita el doble prefijo de la clase para armar los nombres de los campos
	  $cFisicoClase = substr($cFisico, 2);
	  // Alta del Codigo
	  $cdAtributo 	= "Codigo de $cdClase";
	  $cFisico 		= "nc" . $cFisicoClase;
	  $ncTipoAtributo	= 1;
	  $cdClaseAtributo= "tinyint";
	  $ncAtributo = 1;
	  $this->oDatabase->insert("stClaseAtributo", "cDescripcion", $cDescripcion,  "ncTipoAtributo", $ncTipoAtributo, "cFisico", $cFisico, "cdAtributo", $cdAtributo, "fLongitud", $fLongitud, "cdClaseAtributo", $cdClaseAtributo, "ncAtributo", $ncAtributo, "ncClase", $ncClase );
	  // Alta de la Descripcion
	  $cdAtributo 	= "Descripcion de $cdClase";
	  $cFisico 		= "cd" . $cFisicoClase;
	  $ncTipoAtributo	= 2;
	  $cdClaseAtributo= "varchar";
	  $fLongitud = 40;
	  $ncAtributo = 2;
	  $this->oDatabase->insert("stClaseAtributo", "cDescripcion", $cDescripcion,  "ncTipoAtributo", $ncTipoAtributo, "cFisico", $cFisico, "cdAtributo", $cdAtributo, "fLongitud", $fLongitud, "cdClaseAtributo", $cdClaseAtributo, "ncAtributo", $ncAtributo, "ncClase", $ncClase );
	  $oForm->reset();
		// Redirecciona la siguiente accion
	  $this->oModule->setRedirect( MODIFICAR_CLASE, "ncClase=$ncClase" );
	}
	//DUPLICAR_UNA_CLASE:
	function duplicate()
	  {
		// Convierte a variables los datos del Formulario asociado a la accion
		$oForm = $this->oModule->loadClass( 'Duplicar_frm' );
		extract( $oForm->getFieldArray() );
		// Si no viene el Directorio lo Obtiene del Modulo
		if ( $cDirectorio == '' )
		{
		  // Si es Tabla => pone los default
		  if ( $ncTipoClase == TIPO_CLASE_PARAMETRICAS || $ncTipoClase == TIPO_CLASE_MOVIMIENTOS )
		  {
			$cArchivo = $cFisico . "_cre.sql";
			$cDirectorio .= "db";
		  } elseif ( $cArchivo == '' )
		  {
			$cArchivo = $cFisico ;
		  }
		}
		// Da de Alta la Clase
		$ncClase = $this->oDatabase->nextKey("stClase", "ncClase" );
		$this->oDatabase->insert("stClase",
				  "ncSubModulo", $ncSubModulo,
				  "cArchivo", $cArchivo,
				  "cDirectorio", $cDirectorio,
				  "ncTipoClase", $ncTipoClase,
				  "cFisico", $cFisico,
				  "cdClase", $cdClase,
				  "ncClase", $ncClase );
		// Dar de Alta los Atributos
		$cSql = "SELECT ncAtributo,cdAtributo,cFisico,cDescripcion,cdClaseAtributo,cPropiedades,fLongitud,ncTipoAtributo,nOrden,ncTermino
					FROM stClaseAtributo
					WHERE ncClase = $ncClaseBase";
		$this->oDatabase->query($cSql);
		while( $this->oDatabase->moveNext() )
		{
		  // Agrega el Registro
		  $this->oDatabase->insert("stClaseAtributo",
					"ncAtributo" , $this->oDatabase->aFields['ncAtributo'],
					"cdAtributo", $this->oDatabase->aFields['cdAtributo'],
					"cFisico", $this->oDatabase->aFields['cFisico'],
					"cDescripcion", $this->oDatabase->aFields['cDescripcion'],
					"cdClaseAtributo", $this->oDatabase->aFields['cdClaseAtributo'],
					"cPropiedades", $this->oDatabase->aFields['cPropiedades'],
					"fLongitud", $this->oDatabase->aFields['fLongitud'],
					"ncTipoAtributo", $this->oDatabase->aFields['ncTipoAtributo'],
					"nOrden", $this->oDatabase->aFields['nOrden'],
					"ncTermino", $this->oDatabase->aFields['ncTermino'],
					"ncClase", $ncClase);
		}
		$oForm->reset();
		// Redirecciona la siguiente accion
		$this->oModule->setRedirect( MODIFICAR_CLASE, "ncClase=$ncClase" );
	  }
	}
?>
